//
//  DBHelper.h
//  TravelGuideMdd
//
//  Created by BigPolarBear on 13-5-20.
//  Copyright (c) 2013年 mafengwo.com. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "DBConst.h"
#import "FMDatabase.h"
#import "FMDatabaseQueue.h"
#import "FMDB_TGM_Category.h"


/** */
@interface DBHelper : NSObject{}

#pragma mark ------ 辅助方法

/** 将数组自动转为可直接用于where里in语句（字符串自动做转义）
 例如：数组["a","b","c"]
 转为：'a','b','c' */
+(NSString*)sqlInArray:(NSArray*)array;

/** 输出带左右单引号的字符串（原字符串内单引号会自动转义，避免SQL注入） */
+(NSString*)stringWithQuotes:(NSString*)str;

/** 是否是基础列名 */
+(BOOL)isBaseColumnName:(NSString*)columnName;





#pragma mark ------ 执行SQL脚本

#pragma mark 数据库首次创建脚本

+(BOOL)executeCacheCreateDatabase:(FMDatabase*)db;

#pragma mark 缓存表相关


/** 清除指定key的缓存 */
+(BOOL)executeCacheDeleteForKey:(NSString*)key database:(FMDatabase*)db;

+(BOOL)executeCacheDelete:(FMDatabase*)db;

/** 设置KV缓存 */
+(BOOL)executeCacheSetValue:(NSString*)value forKey:(NSString*)key database:(FMDatabase*)db;


/** 获取KV缓存 */
+(FMResultSet*)executeCacheSelectValueForKey:(NSString*)key database:(FMDatabase*)db;
/** 获取缓存数据（含数据库中的维护字段） */
+(FMResultSet*)executeCacheSelectForKey:(NSString*)key database:(FMDatabase*)db;
/** 按key前缀，获取缓存数据（含数据库中的维护字段） */
+(FMResultSet*)executeCacheSelectForKeyPrefix:(NSString*)keyPrefix database:(FMDatabase*)db;


#pragma mark 查询脚本执行
/**
 查询脚本（根据id顺序返回结果）
 
 @param tableName   表名
 @param c_ids       id列表
 */
+(FMResultSet*)executeSelectTable:(NSString*)tableName
                            c_ids:(NSArray*)c_ids
                         database:(FMDatabase*)db;

/** 
 查询脚本（取全部数据）
 
 @param tableName    表名
 @param columnNames  返回的列名数组
 @param filterDict   过滤条件(其中 key = value)
 @param orderBy      按哪一列排序
 @param desc         是否是倒序
 @param db           已打开的数据库
 */
+(FMResultSet*)executeSelectTable:(NSString*)tableName
                      columnNames:(NSArray*)columnNames
                       filterDict:(NSDictionary*)filterDict
                          orderBy:(NSString*)orderByColumnName
                             desc:(BOOL)desc
                         database:(FMDatabase*)db;


/**
 查询脚本（统计数据）
 
 @param tableName    表名
 @param filterDict   过滤条件(其中 key = value)
 @param db           已打开的数据库
 */
+(NSInteger)executeCountTable:(NSString*)tableName
                   filterDict:(NSDictionary*)filterDict
                     database:(FMDatabase*)db;

#pragma mark 删除脚本执行
/**
 删除脚本
 
 @param tableName    表名
 @param filterDict   过滤条件(其中 key = value)
 @param db           已打开的数据库
 */
+(BOOL)executeDeleteTable:(NSString*)tableName
               filterDict:(NSDictionary*)filterDict
                 database:(FMDatabase*)db;

/**
 删除脚本
 
 @param tableName    表名
 @param db           已打开的数据库
 */
+(BOOL)executeDeleteTable:(NSString*)tableName
                 database:(FMDatabase*)db;



#pragma mark 插入与更新脚本执行
/**
 执行Insert脚本（自动更新时间戳c_ctime,c_utime）
 
 @param name    表名
 @param c_id    主键id
 @param c_json  json字串
 @param dict    在字典中指定要更新的列名（key）和值（value）
 @param db      数据库（需要在调用前open）
 */
+(BOOL)executeInsertTable:(NSString*)tableName
                     c_id:(NSString*)c_id
                   c_json:(NSString*)c_json
   withColumnKeyValueDict:(NSDictionary*)dict
                 database:(FMDatabase*)db;

/**
 执行Update脚本（自动更新时间戳c_utime）
 
 @param name    表名
 @param c_id    主键id
 @param c_json  json字串
 @param dict    在字典中指定要更新的列名（key）和值（value）
 @param db      数据库（需要在调用前open）
 */
+(BOOL)executeUpdateTable:(NSString*)tableName
                     c_id:(NSString*)c_id
                   c_json:(NSString*)c_json
   withColumnKeyValueDict:(NSDictionary*)dict
                 database:(FMDatabase*)db;

/**
 执行Update脚本（自动更新时间戳c_utime）
 
 @param name    表名
 @param c_id   主键id
 @param dict    在字典中指定要更新的列名（key）和值（value）
 @param db      数据库（需要在调用前open）
 */
+(BOOL)executeUpdateTable:(NSString*)tableName
                     c_id:(NSString*)c_id
   withColumnKeyValueDict:(NSDictionary*)dict
                 database:(FMDatabase*)db;

/**
 执行导入，若存在则自动更新脚本（自动更新时间戳c_ctime,c_utime）
 
 @param tableName    表名
 @param c_id    主键id
 @param c_json  内容
 @param dict    在字典中指定要更新的列名（key）和值（value）
 @param db      数据库（需要在调用前open）
 */
+(BOOL)executeInsertOrUpdateTable:(NSString*)tableName
                             c_id:(NSString*)c_id
                           c_json:(NSString*)c_json
           withColumnKeyValueDict:(NSDictionary*)dict
                         database:(FMDatabase*)db;

/**
 执行删除：指定id
 
 @param tableName    表名
 @param c_ids   主键id列表
 @param db      数据库（需要在调用前open）
 */
+(BOOL)executeDeleteTable:(NSString*)tableName
                    c_ids:(NSArray*)c_ids
                 database:(FMDatabase*)db;

#pragma mark 定制查询
/** 根据关键词搜索，按拼音排序 */
+(FMResultSet*)executeSelectMddSimpleByKeyword:(NSString*)keyword
                                      database:(FMDatabase*)db;

/** 根据类型，按拼音排序*/
+(FMResultSet*)executeSelectMddSimpleByTypeRegion:(NSString*)type_region
                                         database:(FMDatabase*)db;



#pragma mark 游记草稿
+(BOOL)executeNoteCacheCreateDatabase:(FMDatabase*)db;

+(BOOL)executeNoteDeleteForKey:(NSString*)key database:(FMDatabase*)db;

+(BOOL)executeNoteSetValue:(NSString*)value forKey:(NSString*)key database:(FMDatabase*)db;

+(FMResultSet*)executeNoteSelectValueForKey:(NSString*)key database:(FMDatabase *)db;
#pragma mark 下载的城市信息
+(void)insertCityInfoWithCityJson:(NSString *)jsonString andCityId:(NSString *)cityId andState:(NSString *)state withDB:(FMDatabase *)db andCurrentCount:(NSInteger)currentCOunt andAllCount:(NSInteger)allCount;

+(NSMutableArray *)selectAllCityInfoFromDatabase:(FMDatabase *)db;

+ (NSMutableArray *)selectAllCityIdFromDatabase:(FMDatabase *)db;


+ (void)updateDownloadStateWithCityId:(NSString *)cityId andDB:(FMDatabase *)db andState:(NSString *)state;

+ (NSString *)getDownloadStateWithCityId:(NSString *)cityId andDatabase:(FMDatabase *)db;

+ (NSMutableArray *)getDownloadStateWithDatabase:(FMDatabase *)db;


+ (void)updatedownloadCountWithCityId:(NSString *)cityId andDownloadCount:(NSString *)count andDatabase:(FMDatabase *)db;

+ (NSMutableArray *)getDownloadCountArrayWithDataBase:(FMDatabase *)db;

+ (NSMutableArray *)getAllCountArrayWithDataBase:(FMDatabase *)db;

+ (NSString *)getJsonStringWithCityId:(NSString *)cityId andDatabase:(FMDatabase *)db;

+ (NSString *)getDownloadCountWithCityId:(NSString *)cityId andDatabase:(FMDatabase *)db;

+(void)deleteItemWithItemId:(NSString *)cityId withDatabase:(FMDatabase *)db;

#pragma mark 食记本地操作
+ (NSString *)getTypeStringWithNoteId:(NSString *)noteId andDataBase:(FMDatabase *)db;
+(BOOL) deleteNoteItem:(NSString*) dbid withDatabase:(FMDatabase*)db;
+(void)insertDailyJsonString:(NSString *)jsonString andKey:(NSString *)key type:(NSString *)type WithDatabase:(FMDatabase *)db;

+ (NSMutableArray *)getAllJsonIdWith:(FMDatabase *)db;

+ (NSString *)getJsonStringWithIndex:(NSString *)indexSring andDataBase:(FMDatabase *)db;

+ (NSMutableArray *)getDataCountWith:(FMDatabase *)db;
+ (NSMutableArray *)getAllJsonStringWith:(FMDatabase *)db;

+(NSString *)getJSonCurrentIDwithjSONWithJsonString:(NSString *)jsonString andDataBase:(FMDatabase *)db;

+ (void)updatedownJsonStringWithCurrentId:(NSString *)currentId andNewJsonString:(NSString *)newString andDataBase:(FMDatabase *)db;

#pragma mark 本地清单餐厅操作
+(void)insertTraveListRest:(NSString *)jsonString andKey:(NSString *)key WithDatabase:(FMDatabase *)db;
+(void)deleteTraveListRest:(NSString*)invid withDatabase:(FMDatabase*)db;
+ (void)updateTraveListRest:(NSString *)invid andNewJsonString:(NSString *)newString andDataBase:(FMDatabase *)db;
+ (NSString *)getJsonStringWithInvid:(NSString *)invid andDatabase:(FMDatabase *)db;
+ (NSMutableArray *)getAllInvdidArrayWithDataBase:(FMDatabase *)db;
@end
